#ifndef ETG_ALMACENAMIENTO_H_
#define ETG_ALMACENAMIENTO_H_

#include "../almacenamiento/Almacenamiento.h"
#include "../../enums/TipoMemoria.h"
#include "../../enums/TipoAlmacenamiento.h"
#include "../../enums/TipoSerializacion.h"
#include <vector>
using namespace std;

class Etg_Almacenamiento{
		
	protected:
		void *posIni; 
		unsigned int offset; 
		TipoMemoria tipoMem;
		Almacenamiento  **persistencia;
		TipoAlmacenamiento tipoA;
		
		void ubicar(Compuesto *compuesto, Dato *daux,unsigned int *pos, unsigned int *tam, TipoSerializacion tipoS);
		
	public:
	
		/**
		 * 
		 * Crea un almacenamiento nuevo
		 * 
		 *  @author veronica
		 * 
		 * @param listaDatos: array de datos a almacenar en la carga inicial 
		 * 
		 */
	
		virtual void crear(TipoMemoria tipo, std::vector<Dato*> listaDatos, void *ptr)=0;
	
		/**
		 * Realiza la insercion de un nuevo registro
		 * 
		 * pre: no realiza validacion de unicidad, el indice es quien se encarga de esto previo 
		 * pedir su insercion, no valida espacio libre, de esto se encarga el recurso de almacenamiento...
		 * 
		 * 
		 * @param Dato*: dato a almacenar, se hace una copia del mismo donde corresponda 
		 * 
		 * 
		 */
		virtual void insertar(Dato *nvoDato,int* nroComponente)=0;
		
		/**
		 * 
		 * Lee un dato 
		 *
		 * @param PrimaryKey: clave primaria del registro a leer 
		 * 
		 */
		virtual void leer(Dato *dato)=0;
		
		virtual void leer(Dato *dato,int nroBloque)=0;
				
		/**
		 * Borra un registro existente
		 * @param Dato*: dato que solo posee la clave primaria a localizar para elimiar 
		 */
		virtual void eliminar(Dato *daux,int nroComponente)=0;
				
		/**
		 * Realiza la actualizacion de un registro
		 * 
		 * pre: la clave existe, pues el indice se encarga de validarlo 
		 * 
		 * ES ASI ¿?¿?¿? HELP!
		 * 
		 * @param Dato*: dato completo por el cual debe reemplazar al existente 
		 * se hace una copia del mismo donde corresponda 
		 * 
		 */
		virtual void modificar(Dato *dAux)=0;
		
		virtual void modificar(Dato *dAux, int bOrig, int *bDest)=0;
	
			
};

#endif /*ALMACENAMIENTO_H_*/
